package com.ffggffgfv.backend.service.impl;

import com.ffggffgfv.backend.dto.PageResult;
import com.ffggffgfv.backend.dto.RolePermissionDTO;
import com.ffggffgfv.backend.entity.Permission;
import com.ffggffgfv.backend.entity.Role;
import com.ffggffgfv.backend.entity.RolePermission;
import com.ffggffgfv.backend.mapper.PermissionMapper;
import com.ffggffgfv.backend.mapper.RoleMapper;
import com.ffggffgfv.backend.mapper.RolePermissionMapper;
import com.ffggffgfv.backend.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 角色服务实现类
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private RolePermissionMapper rolePermissionMapper;

    /**
     * 分页查询角色列表
     *
     * @param name     角色名称（可选）
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 角色列表
     */
    @Override
    public PageResult<Role> findByPage(String name, int pageNum, int pageSize) {
        // 计算偏移量
        int offset = (pageNum - 1) * pageSize;

        // 查询总数
        long total = roleMapper.countAll(name);

        // 查询当前页数据
        List<Role> roles = roleMapper.selectAll(name, offset, pageSize);

        // 返回分页结果
        return new PageResult<>(roles, total, pageNum, pageSize);
    }

    /**
     * 根据ID查询角色
     *
     * @param id 角色ID
     * @return 角色对象
     */
    @Override
    public Role findById(Long id) {
        return roleMapper.selectById(id);
    }

    /**
     * 创建角色
     *
     * @param role 角色对象
     * @return 创建的角色对象
     */
    @Override
    public Role createRole(Role role) {
        // 设置创建时间
        role.setCreateTime(new Date());

        // 设置默认状态
        if (role.getStatus() == null) {
            role.setStatus(1);
        }

        // 插入数据
        roleMapper.insert(role);

        return role;
    }

    /**
     * 更新角色
     *
     * @param id   角色ID
     * @param role 角色对象
     * @return 更新后的角色对象
     */
    @Override
    public Role updateRole(Long id, Role role) {
        // 查询原角色
        Role existingRole = roleMapper.selectById(id);
        if (existingRole == null) {
            return null;
        }

        // 设置ID
        role.setId(id);

        // 更新数据
        roleMapper.update(role);

        // 返回更新后的角色
        return roleMapper.selectById(id);
    }

    /**
     * 判断角色编码是否已存在
     *
     * @param code 角色编码
     * @return 是否存在
     */
    @Override
    public boolean isCodeExists(String code) {
        return roleMapper.selectByCode(code) != null;
    }

    /**
     * 分配角色权限
     *
     * @param roleId            角色ID
     * @param rolePermissionDTO 权限ID列表DTO
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean assignPermissions(Long roleId, RolePermissionDTO rolePermissionDTO) {
        // 先删除当前角色的所有权限关联
        rolePermissionMapper.deleteByRoleId(roleId);

        // 如果权限ID列表为空，则直接返回成功
        if (rolePermissionDTO.getPermissionIds() == null || rolePermissionDTO.getPermissionIds().isEmpty()) {
            return true;
        }

        // 构建角色权限关联对象列表
        List<RolePermission> rolePermissions = new ArrayList<>();
        Date now = new Date();

        for (Long permissionId : rolePermissionDTO.getPermissionIds()) {
            RolePermission rp = new RolePermission();
            rp.setRoleId(roleId);
            rp.setPermissionId(permissionId);
            rp.setCreateTime(now);
            rolePermissions.add(rp);
        }

        // 批量插入角色权限关联
        return rolePermissionMapper.batchInsert(rolePermissions) > 0;
    }

    /**
     * 获取角色的权限列表
     *
     * @param roleId 角色ID
     * @return 权限列表
     */
    @Override
    public List<Permission> getPermissions(Long roleId) {
        return permissionMapper.selectByRoleId(roleId);
    }

    /**
     * 获取角色的权限ID列表
     *
     * @param roleId 角色ID
     * @return 权限ID列表
     */
    @Override
    public List<Long> getPermissionIds(Long roleId) {
        return rolePermissionMapper.selectPermissionIdsByRoleId(roleId);
    }
}
